const express = require('express');
const cors = require('cors');
const rateLimit = require('express-rate-limit');
require('dotenv').config();

const hotspotsRoutes = require('./routes/hotspots');
const visitorsRoutes = require('./routes/visitors');
const { rateLimitMiddleware } = require('./middleware/rateLimit');

const app = express();
const PORT = process.env.PORT || 3001;

// 信任代理设置（用于Nginx反向代理）
app.set('trust proxy', ['loopback', 'linklocal', 'uniquelocal']); 


// 中间件配置
app.use(cors({
  origin: true, // 允许所有来源（开发环境）
  credentials: true
}));

app.use(express.json({ limit: '10mb' }));
app.use(express.urlencoded({ extended: true }));

// 全局速率限制
const globalLimiter = rateLimit({
  windowMs: 1 * 60 * 1000, // 1分钟
  max: process.env.RATE_LIMIT || 100, // 每分钟最大请求数
  message: {
    error: '请求过于频繁，请稍后再试'
  },
  standardHeaders: true,
  legacyHeaders: false
});

app.use(globalLimiter);

// 路由
app.use('/api/hotspots', hotspotsRoutes);
app.use('/api/visitors', visitorsRoutes);

// 健康检查端点（用于Docker健康检查）
app.get('/api/health', (req, res) => {
  res.json({
    status: 'healthy',
    timestamp: new Date().toISOString(),
    uptime: process.uptime(),
    memory: process.memoryUsage(),
    env: process.env.NODE_ENV
  });
});

// 根路由
app.get('/', (req, res) => {
  res.json({
    message: '热点追踪API服务',
    version: '1.0.0',
    endpoints: {
      '/api/hotspots': '获取热点列表',
      '/api/hotspots/:id': '获取热点详情',
      '/api/hotspots/search/:query': '搜索热点',
      '/api/hotspots/platforms/list': '获取平台列表',
      '/api/hotspots/health/check': '健康检查',
      '/api/hotspots/cache/status': '缓存状态',
      '/api/hotspots/cache/clear': '清除缓存',
      '/api/visitors/stats': '获取访问统计',
      '/api/visitors/record': '记录新访问'
    },
    timestamp: new Date().toISOString()
  });
});

// 404处理
app.use('*', (req, res) => {
  res.status(404).json({
    error: '接口不存在',
    path: req.originalUrl
  });
});

// 全局错误处理
app.use((error, req, res, next) => {
  console.error('Global error handler:', error);
  
  res.status(error.status || 500).json({
    error: error.message || '服务器内部错误',
    ...(process.env.NODE_ENV === 'development' && { stack: error.stack })
  });
});

// 优雅关闭
process.on('SIGINT', () => {
  console.log('正在关闭服务器...');
  process.exit(0);
});

process.on('SIGTERM', () => {
  console.log('收到终止信号，正在关闭服务器...');
  process.exit(0);
});

// 启动服务器
const server = app.listen(PORT, () => {
  console.log(`
🚀 热点追踪API服务已启动
📍 本地地址: http://localhost:${PORT}
📍 网络地址: http://*.*.*.*:${PORT}
📊 环境: ${process.env.NODE_ENV || 'development'}
⏰ 时间: ${new Date().toLocaleString('zh-CN')}
  `);
});

// 处理未捕获的异常
process.on('unhandledRejection', (reason, promise) => {
  console.error('未处理的Promise拒绝:', reason);
});

process.on('uncaughtException', (error) => {
  console.error('未捕获的异常:', error);
  process.exit(1);
});

module.exports = server;
